package kr.pe.johnkim.sendme.provider;

import java.util.ArrayList;
import java.util.List;

import kr.pe.johnkim.sendme.activity.R;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 친구 목록에 출력하는 어댑터 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class SendMeFriendAdapter extends BaseAdapter implements Filterable{
	
	private Context context;
	private ArrayList<SendMeFriend> friendList;
	private SendMeFriend friend;
	LayoutInflater layoutInflater;
	
	private ArrayList<SendMeFriend> orgFriendList;		//  원본은 저장해두어야 계속 필터링해서 사용할 수 있음
	private ArrayList<SendMeFriend> arrayListData;		// 필터링 작업을 위해 필요. (필터링된 데이터들을 담아서 리턴)
	
	SendMeCommon sendMeCommon;
	
	String TAG = "SendMeFriendAdapter";
	
	View view;
	
	ImageButton imageButtonSendCheck ;
	TextView txtViewFriendName;				// 친구 이름.
	
	
	public SendMeFriendAdapter(Context context, ArrayList<SendMeFriend> friendList) {
		this.context = context;
		this.friendList = friendList;
		this.orgFriendList = friendList;				// 원본도 저장해둠		
		layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		
		sendMeCommon = new SendMeCommon();
	}

	@Override
	public int getCount() {
		if(friendList!=null){
			return friendList.size();
		}else{
			return 0;
		}
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return friendList.get(position);
	}

	// 필터링
	@Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
            	// 작업이 끝난후
            	// 결과를 세팅하고 갱신
            	friendList = (ArrayList<SendMeFriend>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                arrayListData = new ArrayList<SendMeFriend>();

                // perform your search here using the searchConstraint String.
                constraint = constraint.toString().toLowerCase();				// 검색어 - 대소문자 무시
                
                // 원본으로 작업을 함. 기존 friendList를 사용하면 필터링 결과를 가지고 다시 필터링 하므로 결국 아무것도 남지 않게 됨
                friendList = orgFriendList;
                
                if(friendList!=null && friendList.size()>0){
                	 // 전체 개수 만큼
                    for (int i = 0; i < friendList.size(); i++) {
                    	// 비교할 조건을 꺼냄
                    	SendMeFriend tempSendMeFriend = friendList.get(i);
                        String dataNames = tempSendMeFriend.getName();
                        
                        // 조건 비교. ~로 시작하는지 / ~를 포함하는지
//                      if (dataNames.toLowerCase().startsWith(constraint.toString()))  {		// 검색어로 시작할때
                    	if (dataNames.toLowerCase().contains(constraint.toString()))  {			// 검색어를 포함할때
                    		// 담는다
                        	arrayListData.add(tempSendMeFriend);
                        }
                    }
                }
                
                // results 에 저장한다
                results.count = arrayListData.size();
                results.values = arrayListData;
//                Log.e(TAG,"count::"+ arrayListData.size());
//                Log.e(TAG,"VALUES::"+ results.values.toString());
                // 반환한다
                return results;
            }
        };

        return filter;		        // 필터 정의 끝
    }
	
	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		
		view = convertView;
		
		ViewWrapper wrapper = null;
		// 태그를 이용하여 position 값을 정확한 값을 사용하도록 함. 태그를 저장후 나중에 태그값을 꺼내어 사용
		if(view == null) {
			view = layoutInflater.inflate(R.layout.activity_send_me_friend_row, parent, false);
			wrapper = new ViewWrapper(view);
			view.setTag(wrapper);
		} else {
			wrapper = (ViewWrapper)view.getTag();
		}
		
		friend = friendList.get(position);
		
		txtViewFriendName = (TextView)view.findViewById(R.id.txtViewFriendName);
		
		imageButtonSendCheck = (ImageButton) view.findViewById(R.id.imageButtonSendCheck);
		imageButtonSendCheck.setTag(position);
		
		imageButtonSendCheck.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				int selectedPosition = Integer.parseInt(v.getTag()+"");
				Log.d(TAG,"selectedPosition:"+selectedPosition);
				if(friendList.get(selectedPosition).getIsSelectedForSend()==false){
					friendList.get(selectedPosition).setSelectedForSend(true);
					v.setBackgroundResource(R.drawable.blue_checkbox_on);
//					Log.d(TAG,"friendList.get(selectedPosition):"+selectedPosition+"//IsSelectedForSend//name:"+friendList.get(selectedPosition).getName());
				}else{
					friendList.get(selectedPosition).setSelectedForSend(false);
					v.setBackgroundResource(R.drawable.blue_checkbox_off);
				}
			}
		});
		// 체크 여부에 따라 이미지를 세팅 한다.
		if(friend.getIsSelectedForSend()) {
			imageButtonSendCheck.setBackgroundResource(R.drawable.blue_checkbox_on);
		} else {
			imageButtonSendCheck.setBackgroundResource(R.drawable.blue_checkbox_off);
		}
		
		// 설치 여부에 따라 이미지를 세팅 한다.
		if(("Y").equals(friend.getInstallYn())) {
			wrapper.getImgViewInstall().setVisibility(View.VISIBLE);		// 설치 사용자인지
//					wrapper.getImageButtonSendCheck().setEnabled(true);				
		} else {
			wrapper.getImgViewInstall().setVisibility(View.INVISIBLE);
//					wrapper.getImageButtonSendCheck().setEnabled(true);			// 전송 가능 여부. false -> 항상 true 로 변경
		}
				
		// 친구 이름 / 전화번호 세팅 한다.
		if(friend.getName().length()>0){
			txtViewFriendName.setText(friend.getName());
		}else{
			txtViewFriendName.setText(friend.getPhoneNumber());
		}
		wrapper.getTxtViewFriendPhoneNumber().setText(sendMeCommon.phoneNumberForShowFormat(friend.getPhoneNumber()));	// 그룹일수가 없음
		
		
		
		
		return view;
	}
	
	class ViewWrapper {
		View base;
		
		
		TextView txtViewFriendPhoneNumber;				// 친구 전화번호.
		ImageView imgViewInstall;				// 설치 여부.
		ImageButton imageButtonSendCheck;		// 보낼 사람 선택.
		
		ViewWrapper(View base) {
			this.base = base;
		}
		
		
		TextView getTxtViewFriendPhoneNumber() {
			if(txtViewFriendPhoneNumber == null) {
				txtViewFriendPhoneNumber = (TextView)view.findViewById(R.id.txtViewFriendPhoneNumber);
			}
			
			return txtViewFriendPhoneNumber;
		}
		
		ImageView getImgViewInstall() {
			if(imgViewInstall == null) {
				imgViewInstall = (ImageView)view.findViewById(R.id.imgViewInstall);
			}
			
			return imgViewInstall;
		}
		
		ImageButton getImageButtonSendCheck() {
			if(imageButtonSendCheck == null) {
				imageButtonSendCheck = (ImageButton)view.findViewById(R.id.imageButtonSendCheck);
			}

			return imageButtonSendCheck;
		}
	}

}
